﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace CCL.SocketMessage.Response
{
    /// <summary>
    /// 프로젝트 Commit 요청에 대한 응답을 제공합니다.
    /// </summary>
    public class CommitProject : ResponseBody
    {
        /// <summary>
        /// Commit 되는 Revision Number를 가져옵니다.
        /// </summary>
        public int Revision { get; private set; }

        /// <summary>
        /// 성공한 응답 CommitProject를 생성합니다.
        /// </summary>
        /// <param name="revision"></param>
        public CommitProject(int revision)
            : base()
        {
            Revision = revision;
        }

        /// <summary>
        /// 실패한 응답 GetProjectList를 생성합니다.
        /// </summary>
        /// <param name="errorMessage"></param>
        public CommitProject(string errorMessage)
            : base(errorMessage)
        {

        }

        /// <summary>
        /// 직렬화된 byte 배열을 통해 CommitProject 객체를 생성합니다.
        /// </summary>
        /// <param name="bytes">직렬화된 byte 배열</param>
        public CommitProject(byte[] bytes)
            : base(bytes)
        {
            if (Result == Constant.Result.Success)
            {
                int startIndex = 1;

                Revision = BitConverter.ToInt32(bytes, startIndex);
                startIndex += sizeof(Int32);
            }
        }

        /// <summary>
        /// 바이트 배열로 직렬화 합니다.
        /// </summary>
        /// <returns>직렬화된 바이트 배열</returns>
        public override byte[] GetByte()
        {
            byte[] baseBytes = base.GetByte();
            byte[] temp;
            
            if (Result == Constant.Result.Success)
            {
                int start = 1;

                temp = BitConverter.GetBytes(Revision);
                Array.Copy(temp, 0, baseBytes, start, temp.Length);
            }

            return baseBytes;
        }

        /// <summary>
        /// 직렬화 가능한 객체의 바이트 사이즈를 가져옵니다.
        /// </summary>
        /// <returns>직렬화된 바이트 사이즈</returns>
        public override uint GetSize()
        {
            uint size = base.GetSize();

            // 성공했을 시에는 ErrorMessage를 제외한 나머지 필드의 사이즈를 더한다.
            if (Result == Constant.Result.Success)
            {
                size += sizeof(Int32);                  // Revision
            }

            return size;
        }
    }
}
